package com.qf.lock;

import org.junit.Test;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.concurrent.TimeUnit;

/**
 * Redis实现分布式锁
 * @author zjw
 */
public class RedisLock {


    @Test
    public void lock() throws InterruptedException {
        // 配置连接Redis信息
        Config config = new Config();
        config.setLockWatchdogTimeout(300);
        config.useSingleServer()
                .setAddress("redis://192.168.41.98:6379")
                .setDatabase(0)
                .setPassword("abcedfg");

        // 构建连接redis的客户端
        RedissonClient redissonClient = Redisson.create(config);

        // 获取锁对象
        RLock lock = redissonClient.getLock("lock");

        try {
            // 获取锁资源,基于LUA脚本执行三个命令尝试设置key-hash，在leaseTime为-1时，会开启看门狗机制，由另外一个线程，每LockWatchdogTimeout/3重置生存时间为LockWatchdogTimeout
            if (lock.tryLock(2000, TimeUnit.MILLISECONDS)) {
                // 执行业务代码
                System.out.println("获取锁资源");
                Thread.sleep(100000);
            }
        } finally {
            // 释放锁资源,基于field（UUID:线程标识）判断是否一致，一致才释放锁资源
            lock.unlock();
        }
    }



}
